package com.it.schoolhomeos.repository;

import com.it.schoolhomeos.entity.ClassInfo;
import com.it.schoolhomeos.entity.Notification;
import com.it.schoolhomeos.entity.User;
import com.it.schoolhomeos.enums.NotificationStatus;
import com.it.schoolhomeos.enums.NotificationTargetRole;
import com.it.schoolhomeos.enums.NotificationType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 通知仓库接口
 */
@Repository
public interface NotificationRepository extends JpaRepository<Notification, Long> {
    
    /**
     * 根据通知类型和状态查询通知列表
     * 
     * @param type 通知类型
     * @param status 通知状态
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> findByTypeAndStatusOrderByIsTopDescCreateTimeDesc(
            NotificationType type, NotificationStatus status, Pageable pageable);
    
    /**
     * 根据状态查询通知列表
     * 
     * @param status 通知状态
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> findByStatusOrderByIsTopDescCreateTimeDesc(
            NotificationStatus status, Pageable pageable);
    
    /**
     * 根据通知类型、状态和目标角色查询通知列表
     * 
     * @param type 通知类型
     * @param status 通知状态
     * @param targetRole 目标角色
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> findByTypeAndStatusAndTargetRoleOrderByIsTopDescCreateTimeDesc(
            NotificationType type, NotificationStatus status, NotificationTargetRole targetRole, Pageable pageable);
    
    /**
     * 根据通知类型、状态和班级ID查询通知列表
     * 
     * @param type 通知类型
     * @param status 通知状态
     * @param classId 班级ID
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    @Query("SELECT n FROM Notification n WHERE n.type = ?1 AND n.status = ?2 AND n.classInfo.id = ?3 ORDER BY n.isTop DESC, n.createTime DESC")
    Page<Notification> findByTypeAndStatusAndClassId(
            NotificationType type, NotificationStatus status, Long classId, Pageable pageable);
    
    /**
     * 查询置顶的通知列表
     * 
     * @param status 通知状态
     * @return 置顶通知列表
     */
    List<Notification> findByIsTopTrueAndStatusOrderByCreateTimeDesc(NotificationStatus status);
    
    /**
     * 根据标题模糊查询通知列表
     * 
     * @param title 标题关键字
     * @param status 通知状态
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> findByTitleContainingAndStatusOrderByIsTopDescCreateTimeDesc(
            String title, NotificationStatus status, Pageable pageable);
    
    /**
     * 查询所有通知，按置顶和创建时间排序
     * 
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> findAllByOrderByIsTopDescCreateTimeDesc(Pageable pageable);
    
    /**
     * 根据通知类型分页查找通知
     * 
     * @param type 通知类型，如ANNOUNCEMENT、NEWS、NOTICE
     * @param pageable 分页参数
     * @return 分页的通知列表
     */
    Page<Notification> findByType(String type, Pageable pageable);
    
    /**
     * 根据发布者分页查找通知
     * 
     * @param publisher 发布者用户对象
     * @param pageable 分页参数
     * @return 分页的通知列表
     */
    Page<Notification> findByPublisher(User publisher, Pageable pageable);
    
    /**
     * 根据目标角色分页查找通知
     * 
     * @param targetRole 目标角色，如ALL、TEACHER、PARENT
     * @param pageable 分页参数
     * @return 分页的通知列表
     */
    Page<Notification> findByTargetRole(String targetRole, Pageable pageable);
    
    /**
     * 根据班级分页查找通知
     * 
     * @param classInfo 班级信息对象
     * @param pageable 分页参数
     * @return 分页的通知列表
     */
    Page<Notification> findByClassInfo(ClassInfo classInfo, Pageable pageable);
    
    /**
     * 根据通知类型和目标角色分页查找通知
     * 
     * @param type 通知类型
     * @param targetRole 目标角色
     * @param pageable 分页参数
     * @return 分页的通知列表
     */
    Page<Notification> findByTypeAndTargetRole(String type, String targetRole, Pageable pageable);
    
    /**
     * 根据通知类型和班级分页查找通知
     * 
     * @param type 通知类型
     * @param classInfo 班级信息对象
     * @param pageable 分页参数
     * @return 分页的通知列表
     */
    Page<Notification> findByTypeAndClassInfo(String type, ClassInfo classInfo, Pageable pageable);
    
    /**
     * 根据目标角色和班级分页查找通知
     * 
     * @param targetRole 目标角色
     * @param classInfo 班级信息对象
     * @param pageable 分页参数
     * @return 分页的通知列表
     */
    Page<Notification> findByTargetRoleAndClassInfo(String targetRole, ClassInfo classInfo, Pageable pageable);
    
    /**
     * 根据通知类型、目标角色和班级分页查找通知
     * 
     * @param type 通知类型
     * @param targetRole 目标角色
     * @param classInfo 班级信息对象
     * @param pageable 分页参数
     * @return 分页的通知列表
     */
    Page<Notification> findByTypeAndTargetRoleAndClassInfo(String type, String targetRole, ClassInfo classInfo, Pageable pageable);
    
    /**
     * 根据通知类型查询所有状态的通知列表，按置顶和创建时间排序
     * 
     * @param type 通知类型
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> findByTypeOrderByIsTopDescCreateTimeDesc(NotificationType type, Pageable pageable);
} 